<?php
/**
 * 海草精灵  fasion elf
 * Created by PhpStorm.
 * User: x
 * Date: 2018/9/15
 * Time: 10:13
 */

namespace app\api\controller;
use app\common\controller\HomeBase;
use think\View;
use think\Request;
use think\Controller;
use app\common\model\Aiusers as AiuserModel;
use app\common\model\Zzzailogs as AilogsModel;
use app\common\model\Aimsgrules as AimsgrulesModel;
use app\common\model\Aimsgs as AimsgsModel;
use app\common\model\Aitalk as AitalkModel;
use app\common\model\Aiusersinfo as AiuserinfoModel;

class Elf extends  HomeBase{
    private $_aiuser_model;
    private $_ailogs_model;
    private $_aimsgrules_model;
    private $_aimsgs_model;
    private $_aitalk_model;
    private $_aiuserinfo_model;
    public function _initialize()
    {
        /* * 用户表 * */
        $this->_aiuser_model = new AiuserModel();
        /* * 聊天话术 * */
        $this->_aimsgrules_model = new AimsgrulesModel();
        /* * 聊天记录 * */
        $this->_aimsgs_model = new AimsgsModel();
        /* * 聊天匹配key => value * */
        $this->_aitalk_model = new AitalkModel();
        /* * 用户画像记录表 * */
        $this->_aiuserinfo_model = new AiuserinfoModel();
        /* * 日志记录 * */
        $this->_ailogs_model = new AilogsModel();
    }

// 用户信息采集
    public function talk0915(){
        $reply_msg = '';
        if (Request::instance()->isPost()){
            $request = Request::instance()->post();
            // 1 判断用户是否存在
            $has_socketid = $this->_aiuser_model->where(['socketid'=>$request['id']])->select();
            if($has_socketid){
                // -------------------------- 二次聊天区域 start--------------------------------- //
                // 查询聊天画像采集度 1 判断 用户画像是否存在
                $sure_userinfo = self::check_userinfo($has_socketid[0]['user_id']);

                if($sure_userinfo){
                    // 用户画像存在, 1.1 判断 isclient 是否采集过了,  判断下一个问题的答案

                    $is_client = self::check_status($has_socketid[0]['user_id']);



                    // 判断用户是否回答了  issecond
                    if($is_client[0]['issecond'] == 1){
                        // 已经同意了采集信息, 准备采集年龄 $request['msg']

                        $data = ['age'=>$request['msg']];
                        self::full_userinfo($has_socketid[0]['user_id'],$data);

                        $typeid = 1;
                        $msgtype=0;
                        $reply_array = self::check_reply($typeid,$msgtype);
                        $reply_msg = $reply_array[0]['msgduring'];

                    }elseif($is_client[0]['issecond'] == 2){
                        // 不同意采集信息, 回复不同意采集的回复信息
                        $typeid = 1;
                        $msgtype=-1;
                        $reply_array = self::check_reply($typeid,$msgtype);
                        $reply_msg = $reply_array[0]['msgsecond'];
                    }else{
                        // 还没有采集年龄, 查看是否有采集是否是意向客户
                        // 如果不是意向客户还继续发言的话会采取默认回复 判断用户的isclient
                        if($is_client[0]['isclient'] == 1 ){
                            // 更新采集许可  issecond
                            $data = ['issecond'=>1];
                            self::full_userinfo($has_socketid[0]['user_id'],$data);

                            // 意向用户, 继续问下一个问题  msgage
                            $typeid = 1;
                            $reply_array = self::check_reply($typeid);
                            $reply_msg = $reply_array[0]['msgage'];
                        }elseif($is_client[0]['isclient'] == 2){
                            $reply_msg = '如果不是来咨询的话, 小姐姐没空陪你聊天哟';
                        }else{
                            $reply_msg = '如果不是来咨询的话, 小姐姐没空陪你聊天哟';
                        }

                    }


                }else{
                    // 用户画像不存在, 尚未采集 isclient
                    // 首次回复后的获取聊天数据, 比对聊天反馈
                    $check_answer = self::check_answer($request['msg']);
                    $info_data = [];
                    $info_data['user_id'] =$has_socketid[0]['user_id'];
                    if($check_answer){
                        $info_data['isclient'] = 1;
                        // 找到了对应的回答, 判断是肯定的回答, 就继续返回问问题, 并记录到用户画像里面
                        $typeid = 1;
                        $msgtype=0;
                        $reply_array = self::check_reply($typeid,$msgtype);
                        $reply_msg = $reply_array[0]['msgsecond'];
                    }else{
                        // 找不到对应的回复, 直接回复疑问, 然后继续采集问题
                        $reply_msg = '不是来咨询的, 那你是来撩我的咯';
                        // 写入非意向客户信息
                        $info_data['isclient'] = 2;
                    }
                    // 录入用户的画像
                    $record_userinfo = self::record_client($info_data);
                }

                // 更新用户聊天时间
                $up_chat = self::update_chat_time($has_socketid[0]['user_id']);


                // -------------------------- 二次聊天区域 end--------------------------------- //

            }else{
                //  用户不存在, 创建用户信息
                $ai_data['socketid'] = $request['id'];
                $ai_data['aiusername'] = $request['id'];
                $ai_data['create_time'] = time();
                $ai_data['last_time'] = time();
                $save_aiuser = $this->_aiuser_model->save($ai_data);
                if($save_aiuser){
                    // 发送日志记录
                    $logs = ['log'=> $ai_data['socketid'] . '新用户注册成功','create_time'=>time() ];
                    $this->_ailogs_model->save($logs);
                }
                // 发送问候信息 取用聊天信息
                $msgrules = ['typeid'=>1,'msgtype'=>0];
                $msg_reply =  $this->_aimsgrules_model->where($msgrules)->select();
                $reply_msg = $msg_reply[0]['msgfirst'];
            }
        }else{
            $reply_msg = '没有用户信息,也没有消息';
        }
        return json($reply_msg);
    }



    // ---------------- temp test ---------------//

    // ------------------------ 子类调用方法 -------------------------------//
    // 检测是否是新用户
    protected function has_user($id){ // find($id);
       return $this->_aiuser_model->find($id);
    }
    // 创建用户信息
    protected function create_user($request){
        // 默认用户进来会带参数 username pwd sex age city
        $data = [ 'socketid' => $request['id'],
            'aiusername' => $request->ip,
            'remark' => $request->ip,
            'create_time' => time(),
            'last_time' => time(), ];
        $save_aiuser = $this->_aiuser_model->save($data);
        return $save_aiuser;
    }
    // 日志记录  传入用户标识符+日志信息
    protected function zzzlogs($data){
        $this->_ailogs_model->save([
            'user_id' => $data['user_sign'],
            'log' => $data['log']
        ]);
    }
    // 选择聊天信息
    protected function send_msg($data){
        $s_data = [
            'typeid'=>$data['typeid'],
            'msgtype'=>$data['msgtype'],
        ];
        $msg_reply = $this->_aimsgrules_model->where($s_data)->select();
        return $msg_reply[0][$data['msgfirst']];
    }



// --------------------------------------------------- 需要的方法(勿删) start-------------------------------------//

    /*
     * 采集用户信息
     * */
    public function full_userinfo($user_id,$data=[]){
        $full_user = $this->_aiuserinfo_model->where('user_id',$user_id)->update($data);
        return $full_user;
    }
    /*
     * 根据消息类型,查找回复
     * */
    private function check_reply($typeid=1,$msgtype=0){
        $msgrules = ['typeid'=>$typeid,'msgtype'=>$msgtype];
        $msg_reply =  $this->_aimsgrules_model->where($msgrules)->select();
        return $msg_reply;
//        $reply_msg = $msg_reply[0]['msgsecond'];
    }

    /*
     * 查询用户画像状态 status  user_id
     * */
    private function check_status($user_id){
        $user_status = $this->_aiuserinfo_model->where(['user_id'=>$user_id])->select();
        return $user_status;
//        dump($user_status['isclient']);  int 1
    }

    /*
     * 更新用户聊天时间
     * */
    private function update_chat_time($user_id=0){
        if($user_id){
            // $result = $this->jump_img_model->where('id',$id)->update($img_data);
            $up_chat = $this->_aiuser_model->where('user_id',$user_id)->update(['last_time'=>time()]);
            return $up_chat;
        }
    }

    /*
     * 记录客户意向信息 传入参数  user_id   isclient
     * 1 检测用户画像是否存在   self::check_userinfo($has_socketid[0]['user_id']);
     * */
    private function record_client($data=[]){
        // 1 判断用户画像是否存在
        // 用户已经存在,调用存在的用户数据  查看是否存在用户画像 userinfo
        $has_userinfo = self::check_userinfo($data['user_id']);
        $uinfo_data = [];
        if($has_userinfo){
            $uinfo_data[ 'isclient' ] = $data['isclient'] ;
            // 用户画像已经存在, 可以直接修改, 修改 isclient =1 是意向客户
        }else{
            $uinfo_data[ 'user_id' ] = $data['user_id'] ;
            $uinfo_data[ 'isclient' ] = $data['isclient'] ;
            // 用户画像不存在, 需要修改的时候同时创建  修改 isclient =1 是意向客户
        }
        $uinfo_data['user_id'] = $data['user_id'];
        // 2 创建或者修改用户画像
        $write_userinfo = $this->_aiuserinfo_model->save($uinfo_data);
        return $write_userinfo;
//        dump($write_userinfo);
    }

    /*
     * 验证回复肯定和否定
     * */
    private function check_answer($answer='是'){
        // 匹配用户回复的前1个字符
        $search_key = ['key'=>$answer, 'keytarget'=>2];
        // 匹配否定的回答
        $check_answer = $this->_aitalk_model->where($search_key)->select();
        if($check_answer){
            return false;
        }else{
            return true;
        }
    }

    /*
     * 判断用户画像数据库里面, 用户数据是否存在, 不存在就创建
     * */
    private function check_userinfo($user_id){
        $has_info =  $this->_aiuserinfo_model->where(['user_id'=> $user_id])->select();
        if($has_info){
            // 存在, 可以直接修改
            return true;
        }else{
            // 不存在, 需要创建
            return false;
        }
    }
// --------------------------------------------------- 需要的方法(勿删) end--------------------------------------//
}

/*
 * 1.首先是public修饰符来修饰的函数，是指这个函数可以被其他的类来调用，也可以被自己类里的函数来调用。

2.再看protected修饰符来修饰的函数，是指这个函数可以被继承类调用，也可以被自己类里的函数调用，但不能被其他的类调用。

3.用private修饰符来修饰的函数，就具有更少的权限了，只能被自己类里的其他函数调用，其他的一概不能调用。
 * */

